home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import rb
- import rhythmdb
- from JamendoSaxHandler import JamendoSaxHandler
- import JamendoConfigureDialog
- import os
- import gobject
- import gtk.glade as gtk
- import gnome
- import gconf
- import xml
- import gzip
- import datetime
- jamendo_song_info_uri = 'http://img.jamendo.com/data/dbdump_artistalbumtrack.xml.gz'
- mp32_uri = 'http://api.jamendo.com/get2/bittorrent/file/plain/?type=archive&class=mp32&album_id='
- ogg3_uri = 'http://api.jamendo.com/get2/bittorrent/file/plain/?type=archive&class=ogg3&album_id='
- stream_url = 'http://api.jamendo.com/get2/stream/track/redirect/?id=%s&streamencoding=ogg2'
- artwork_url = 'http://api.jamendo.com/get2/image/album/redirect/?id=%s&imagesize=200'
- artist_url = 'http://www.jamendo.com/get/artist/id/album/page/plain/'
- genre_id3 = [
- 'Blues',
- 'Classic Rock',
- 'Country',
- 'Dance',
- 'Disco',
- 'Funk',
- 'Grunge',
- 'Hip-Hop',
- 'Jazz',
- 'Metal',
- 'New Age',
- 'Oldies',
- 'Other',
- 'Pop',
- 'R&B',
- 'Rap',
- 'Reggae',
- 'Rock',
- 'Techno',
- 'Industrial',
- 'Alternative',
- 'Ska',
- 'Death Metal',
- 'Pranks',
- 'Soundtrack',
- 'Euro-Techno',
- 'Ambient',
- 'Trip-Hop',
- 'Vocal',
- 'Jazz+Funk',
- 'Fusion',
- 'Trance',
- 'Classical',
- 'Instrumental',
- 'Acid',
- 'House',
- 'Game',
- 'Sound Clip',
- 'Gospel',
- 'Noise',
- 'AlternRock',
- 'Bass',
- 'Soul',
- 'Punk',
- 'Space',
- 'Meditative',
- 'Instrumental Pop',
- 'Instrumental Rock',
- 'Ethnic',
- 'Gothic',
- 'Darkwave',
- 'Techno-Industrial',
- 'Electronic',
- 'Pop-Folk',
- 'Eurodance',
- 'Dream',
- 'Southern Rock',
- 'Comedy',
- 'Cult',
- 'Gangsta',
- 'Top 40',
- 'Christian Rap',
- 'Pop/Funk',
- 'Jungle',
- 'Native American',
- 'Cabaret',
- 'New Wave',
- 'Psychadelic',
- 'Rave',
- 'Showtunes',
- 'Trailer',
- 'Lo-Fi',
- 'Tribal',
- 'Acid Punk',
- 'Acid Jazz',
- 'Polka',
- 'Retro',
- 'Musical',
- 'Rock & Roll',
- 'Hard Rock',
- 'Folk',
- 'Folk-Rock',
- 'National Folk',
- 'Swing',
- 'Fast Fusion',
- 'Bebob',
- 'Latin',
- 'Revival',
- 'Celtic',
- 'Bluegrass',
- 'Avantgarde',
- 'Gothic Rock',
- 'Progressive Rock',
- 'Psychedelic Rock',
- 'Symphonic Rock',
- 'Slow Rock',
- 'Big Band',
- 'Chorus',
- 'Easy Listening',
- 'Acoustic',
- 'Humour',
- 'Speech',
- 'Chanson',
- 'Opera',
- 'Chamber Music',
- 'Sonata',
- 'Symphony',
- 'Booty Bass',
- 'Primus',
- 'Porn Groove',
- 'Satire',
- 'Slow Jam',
- 'Club',
- 'Tango',
- 'Samba',
- 'Folklore',
- 'Ballad',
- 'Power Ballad',
- 'Rhythmic Soul',
- 'Freestyle',
- 'Duet',
- 'Punk Rock',
- 'Drum Solo',
- 'Acapella',
- 'Euro-House',
- 'Dance Hall']
-
- class JamendoSource(rb.BrowserSource):
- __gproperties__ = {
- 'plugin': (rb.Plugin, 'plugin', 'plugin', gobject.PARAM_WRITABLE | gobject.PARAM_CONSTRUCT_ONLY) }
-
- def __init__(self):
- rb.BrowserSource.__init__(self, name = _('Jamendo'))
- self._JamendoSource__db = None
- self._JamendoSource__saxHandler = None
- self._JamendoSource__activated = False
- self._JamendoSource__notify_id = 0
- self._JamendoSource__update_id = 0
- self._JamendoSource__info_screen = None
- self._JamendoSource__updating = True
- self._JamendoSource__load_current_size = 0
- self._JamendoSource__load_total_size = 0
- self._JamendoSource__db_load_finished = False
- self._JamendoSource__catalogue_loader = None
- self._JamendoSource__catalogue_check = None
- self._JamendoSource__jamendo_dir = rb.find_user_cache_file('jamendo')
- if os.path.exists(self._JamendoSource__jamendo_dir) is False:
- os.makedirs(self._JamendoSource__jamendo_dir, 448)
-
- self._JamendoSource__local_catalogue_path = os.path.join(self._JamendoSource__jamendo_dir, 'dbdump.xml')
- self._JamendoSource__local_catalogue_temp = os.path.join(self._JamendoSource__jamendo_dir, 'dbdump.xml.tmp')
-
-
- def do_set_property(self, property, value):
- if property.name == 'plugin':
- self._JamendoSource__plugin = value
- else:
- raise AttributeError, 'unknown property %s' % property.name
- return property.name == 'plugin'
-
-
- def do_impl_get_browser_key(self):
- return '/apps/rhythmbox/plugins/jamendo/show_browser'
-
-
- def do_impl_get_paned_key(self):
- return '/apps/rhythmbox/plugins/jamendo/paned_position'
-
-
- def do_impl_pack_paned(self, paned):
- self._JamendoSource__paned_box = gtk.VBox(False, 5)
- self.pack_start(self._JamendoSource__paned_box)
- self._JamendoSource__paned_box.pack_start(paned)
-
-
- def do_impl_show_entry_popup(self):
- self.show_source_popup('/JamendoSourceViewPopup')
-
-
- def do_impl_get_ui_actions(self):
- return [
- 'JamendoDownloadAlbum',
- 'JamendoDonateArtist']
-
-
- def do_impl_get_status(self):
- if self._JamendoSource__updating:
- if self._JamendoSource__load_total_size > 0:
- progress = min(float(self._JamendoSource__load_current_size) / self._JamendoSource__load_total_size, 1)
- else:
- progress = -1
- return (_('Loading Jamendo catalogue'), None, progress)
- qm = self.get_property('query-model')
- return (qm.compute_status_normal('%d song', '%d songs'), None, 0)
-
-
- def do_impl_activate(self):
- if not self._JamendoSource__activated:
- shell = self.get_property('shell')
- self._JamendoSource__db = shell.get_property('db')
- self._JamendoSource__entry_type = self.get_property('entry-type')
- self._JamendoSource__activated = True
- self._JamendoSource__show_loading_screen(True)
- self._JamendoSource__update_id = gobject.timeout_add(21600000, self._JamendoSource__update_catalogue)
- self._JamendoSource__update_catalogue()
- sort_key = gconf.client_get_default().get_string(JamendoConfigureDialog.gconf_keys['sorting'])
- if not sort_key:
- sort_key = 'Artist,ascending'
-
- self.get_entry_view().set_sorting_type(sort_key)
-
- rb.BrowserSource.do_impl_activate(self)
-
-
- def do_impl_delete_thyself(self):
- if self._JamendoSource__update_id != 0:
- gobject.source_remove(self._JamendoSource__update_id)
- self._JamendoSource__update_id = 0
-
- if self._JamendoSource__notify_id != 0:
- gobject.source_remove(self._JamendoSource__notify_id)
- self._JamendoSource__notify_id = 0
-
- if self._JamendoSource__catalogue_loader:
- self._JamendoSource__catalogue_loader.cancel()
- self._JamendoSource__catalogue_loader = None
-
- if self._JamendoSource__catalogue_check:
- self._JamendoSource__catalogue_check.cancel()
- self._JamendoSource__catalogue_check = None
-
- gconf.client_get_default().set_string(JamendoConfigureDialog.gconf_keys['sorting'], self.get_entry_view().get_sorting_type())
- rb.BrowserSource.do_impl_delete_thyself(self)
-
-
- def __catalogue_chunk_cb(self, result, total):
- if not result or isinstance(result, Exception):
- if result:
- print 'error loading catalogue: %s' % result
-
- self._JamendoSource__parser.close()
- self._JamendoSource__db_load_finished = True
- self._JamendoSource__updating = False
- self._JamendoSource__load_db()
- self._JamendoSource__show_loading_screen(False)
- self._JamendoSource__catalogue_loader = None
- return None
- self._JamendoSource__parser.feed(result)
- self._JamendoSource__load_current_size += len(result)
- self._JamendoSource__load_total_size = total
- self._JamendoSource__notify_status_changed()
-
-
- def __load_catalogue(self):
- print 'loading catalogue %s' % self._JamendoSource__local_catalogue_path
- self._JamendoSource__notify_status_changed()
- self._JamendoSource__db_load_finished = False
- self._JamendoSource__saxHandler = JamendoSaxHandler()
- self._JamendoSource__parser = xml.sax.make_parser()
- self._JamendoSource__parser.setContentHandler(self._JamendoSource__saxHandler)
- self._JamendoSource__catalogue_loader = rb.ChunkLoader()
- self._JamendoSource__catalogue_loader.get_url_chunks(self._JamendoSource__local_catalogue_path, 65536, True, self._JamendoSource__catalogue_chunk_cb)
-
-
- def __download_catalogue_chunk_cb(self, result, total, out):
- if not result:
- out.close()
- catalog = gzip.open(self._JamendoSource__local_catalogue_temp)
- out = open(self._JamendoSource__local_catalogue_path, 'w')
- while True:
- s = catalog.read(4096)
- if s == '':
- break
-
- out.write(s)
- out.close()
- catalog.close()
- os.unlink(self._JamendoSource__local_catalogue_temp)
- self._JamendoSource__db_load_finished = True
- self._JamendoSource__show_loading_screen(False)
- self._JamendoSource__catalogue_loader = None
- self._JamendoSource__load_catalogue()
- elif isinstance(result, Exception):
- pass
- else:
- out.write(result)
- self._JamendoSource__load_current_size += len(result)
- self._JamendoSource__load_total_size = total
- self._JamendoSource__notify_status_changed()
-
-
- def __download_catalogue(self):
- print 'downloading catalogue'
- self._JamendoSource__updating = True
- out = open(self._JamendoSource__local_catalogue_temp, 'w')
- self._JamendoSource__catalogue_loader = rb.ChunkLoader()
- self._JamendoSource__catalogue_loader.get_url_chunks(jamendo_song_info_uri, 4096, True, self._JamendoSource__download_catalogue_chunk_cb, out)
-
-
- def __update_catalogue(self):
-
- def update_cb(result):
- self._JamendoSource__catalogue_check = None
- if result is True:
- self._JamendoSource__download_catalogue()
- elif self._JamendoSource__db_load_finished is False:
- self._JamendoSource__load_catalogue()
-
-
- self._JamendoSource__catalogue_check = rb.UpdateCheck()
- self._JamendoSource__catalogue_check.check_for_update(self._JamendoSource__local_catalogue_path, jamendo_song_info_uri, update_cb)
-
-
- def __show_loading_screen(self, show):
- if self._JamendoSource__info_screen is None:
- gladexml = gtk.glade.XML(self._JamendoSource__plugin.find_file('jamendo-loading.glade'), root = 'jamendo_loading_scrolledwindow')
- self._JamendoSource__info_screen = gladexml.get_widget('jamendo_loading_scrolledwindow')
- self.pack_start(self._JamendoSource__info_screen)
- self.get_entry_view().set_no_show_all(True)
- self._JamendoSource__info_screen.set_no_show_all(True)
-
- self._JamendoSource__info_screen.set_property('visible', show)
- self._JamendoSource__paned_box.set_property('visible', not show)
-
-
- def __load_db(self):
- artists = self._JamendoSource__saxHandler.artists
- nbAlbums = 0
- nbTracks = 0
- for artist_key in artists.keys():
- artist = artists[artist_key]
- for album_key in artist['ALBUMS'].keys():
- nbAlbums = nbAlbums + 1
- album = artist['ALBUMS'][album_key]
- for track_key in album['TRACKS'].keys():
- nbTracks = nbTracks + 1
- track = album['TRACKS'][track_key]
- track_id = track['id']
- stream = stream_url % track_id
- entry = self._JamendoSource__db.entry_lookup_by_location(stream)
- if entry == None:
- entry = self._JamendoSource__db.entry_new(self._JamendoSource__entry_type, stream)
-
- release_date = album['releasedate']
- if release_date:
- year = int(release_date[0:4])
- date = datetime.date(year, 1, 1).toordinal()
- self._JamendoSource__db.set(entry, rhythmdb.PROP_DATE, date)
-
- self._JamendoSource__db.set(entry, rhythmdb.PROP_TITLE, track['name'])
- self._JamendoSource__db.set(entry, rhythmdb.PROP_ARTIST, artist['name'])
-
- try:
- genre = genre_id3[int(album['id3genre'])]
- except Exception:
- genre = _('Unknown')
-
- self._JamendoSource__db.set(entry, rhythmdb.PROP_GENRE, genre)
- self._JamendoSource__db.set(entry, rhythmdb.PROP_ALBUM, album['name'])
- trackno = int(track['numalbum'])
- if trackno >= 0:
- self._JamendoSource__db.set(entry, rhythmdb.PROP_TRACK_NUMBER, trackno)
-
-
- try:
- duration = float(track['duration'])
- self._JamendoSource__db.set(entry, rhythmdb.PROP_DURATION, int(duration))
- except Exception:
- pass
-
- self._JamendoSource__db.set(entry, rhythmdb.PROP_MUSICBRAINZ_ALBUMID, album['id'])
-
-
-
- print 'Nb artistes : ' + str(len(artists))
- print 'Nb albums : ' + str(nbAlbums)
- print 'Nb tracks : ' + str(nbTracks)
- self._JamendoSource__db.commit()
- self._JamendoSource__saxHandler = None
-
-
- def __notify_status_changed(self):
-
- def change_idle_cb():
- self.notify_status_changed()
- self._JamendoSource__notify_id = 0
- return False
-
- if self._JamendoSource__notify_id == 0:
- self._JamendoSource__notify_id = gobject.idle_add(change_idle_cb)
-
-
-
- def download_album(self):
- tracks = self.get_entry_view().get_selected_entries()
- format = gconf.client_get_default().get_string(JamendoConfigureDialog.gconf_keys['format'])
- if not format or format not in JamendoConfigureDialog.format_list:
- format = 'ogg3'
-
- if len(tracks) == 1:
- track = tracks[0]
- albumid = self._JamendoSource__db.entry_get(track, rhythmdb.PROP_MUSICBRAINZ_ALBUMID)
- formats = { }
- formats['mp32'] = mp32_uri + albumid
- formats['ogg3'] = ogg3_uri + albumid
- p2plink = formats[format]
- l = rb.Loader()
- l.get_url(p2plink, self._JamendoSource__download_p2plink, albumid)
-
-
-
- def __download_p2plink(self, result, albumid):
- if result is None:
- emsg = _('Error looking up p2plink for album %s on jamendo.com') % albumid
- gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, emsg).run()
- return None
- rb.show_uri(result)
-
-
- def launch_donate(self):
- tracks = self.get_entry_view().get_selected_entries()
- if len(tracks) == 1:
- track = tracks[0]
- albumid = self._JamendoSource__db.entry_get(track, rhythmdb.PROP_MUSICBRAINZ_ALBUMID)
- artist = self._JamendoSource__db.entry_get(track, rhythmdb.PROP_ARTIST)
- url = artist_url + albumid.__str__() + '/'
- l = rb.Loader()
- l.get_url(url, self._JamendoSource__open_donate, artist)
-
-
-
- def __open_donate(self, result, artist):
- if result is None:
- emsg = _('Error looking up artist %s on jamendo.com') % artist
- gtk.MessageDialog(None, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, emsg).run()
- return None
- rb.show_uri(result + 'donate/')
-
-
- def playing_entry_changed(self, entry):
- if not (self._JamendoSource__db) or not entry:
- return None
- if entry.get_entry_type() != self._JamendoSource__db.entry_type_get_by_name('JamendoEntryType'):
- return None
- gobject.idle_add(self.emit_cover_art_uri, entry)
-
-
- def emit_cover_art_uri(self, entry):
- stream = self._JamendoSource__db.entry_get(entry, rhythmdb.PROP_LOCATION)
- albumid = self._JamendoSource__db.entry_get(entry, rhythmdb.PROP_MUSICBRAINZ_ALBUMID)
- url = artwork_url % albumid
- self._JamendoSource__db.emit_entry_extra_metadata_notify(entry, 'rb:coverArt-uri', str(url))
- return False
-
-
- gobject.type_register(JamendoSource)
-